# 增强赋值运算
#  __iadd__(self, other)    +=   x += y（由运算符左侧的对象 x 触发）       加法运算

class S1(str):
    def __iadd__(self, other):
        return len(self) + len(other)


class S2(str):

    def __add__(self, other):
        print("执行了S2的__add__方法")
        return super().__add__(other)

    def __radd__(self, other):
        # __radd__：
        # 当两个对象相加的时候，如果左侧的对象和右侧的对象不同类型，并且左侧的对象没有定义 __add__ 方法，
        # 或者其 __add 方法返回 NotImplemented，那么Python就会取右侧的对象中查找是否有 __radd__ 方法的定义
        print("执行了S2的__radd__方法")
        return len(self) + len(other)


s1 = S1("Apple")
s2 = S2("Banana")
s1 += s2
print(s1)  # 11
print(type(s1))  # <class 'int'>

# 如果运算符 += 左侧的对象没有实现 __iadd__ 方法，那么就会去找它的 __add__ 或者 __radd__ 方法
print("=" * 200)
s2 += s2
# 因为 s2 的 __iadd__ 方法没有被重写，会去找 s2 对象的 __radd__ 方法
print(s2)  # BananaBanana
